(define-module (derivative language)
  #:use-module (srfi srfi-9)
  #:export (<alt>
	    alt?
	    alt-this
	    alt-that

	    <cat>
	    cat?
	    cat-left
	    cat-right

	    <rep>
	    rep?
	    rep-lang))

;;; TODO: Explore what it would be like to have a single list
;;; argument, a list of languages, and treat it appropriately in the
;;; macros and procedures.  Same for <cat>.
(define-record-type <alt>
  (make-alt this that)
  alt?
  (this alt-this)
  (that alt-that))

(define-record-type <cat>
  (make-cat left right)
  cat?
  (left cat-left)
  (right cat-right))

(define-record-type <rep>
  (make-rep lang)
  rep?
  (lang rep-lang))

;;; The empty and null languages are simply the symbols 'empty and
;;; 'epsilon, respectively.
